#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
using namespace std;

//删除并获得点数
//https://leetcode.cn/problems/delete-and-earn/submissions/
//class Solution {
//public:
//    int deleteAndEarn(vector<int>& nums) {
//        int n = nums.size();
//        if (n == 0) return 0;
//        if (n == 1) return nums[0];
//
//        int nummax = 0;
//        for (const auto& x : nums) //找最大值
//            if (x > nummax) nummax = x;
//
//        vector<int> v(nummax + 1); //开辟最大值空间
//
//        for (const auto& x : nums) //映射数值
//            //++v[x];
//            v[x] += x;
//
//        vector<int> f(nummax + 1);
//        vector<int> g(nummax + 1);
//
//        for (int i = 1; i <= nummax; ++i) //因为0没有点数所以从1开始
//        {
//            //f[i] = g[i-1]+v[i]*i; //获得i处的点数(此处的点数为i然后乘以i的数量)
//            f[i] = g[i - 1] + v[i];
//            g[i] = max(f[i - 1], g[i - 1]); //不获取i处的点数
//        }
//        return max(f[nummax], g[nummax]);
//    }
//};


//粉刷房子
//https://leetcode.cn/problems/JEj789/submissions/
// class Solution {
// public:
//     int minCost(vector<vector<int>>& costs) {
//         int m = costs.size();
//         if (m == 1) return min(min(costs[0][0], costs[0][1]), costs[0][2]);
//         int n = costs[0].size();
//         vector<vector<int>> vv(m + 1, vector<int>(n)); //开辟一个[n][3]的数组，记录i处选择每一个颜色的当前最少花费(包括前面选择的)

//         for (int i = 1; i <= m; ++i)
//         {
//             vv[i][0] = min(vv[i - 1][1], vv[i - 1][2]) + costs[i - 1][0];
//             vv[i][1] = min(vv[i - 1][0], vv[i - 1][2]) + costs[i - 1][1];
//             vv[i][2] = min(vv[i - 1][1], vv[i - 1][0]) + costs[i - 1][2];
//         }
//         return min(min(vv[m][0], vv[m][1]), vv[m][2]);
//     }
// };


//最佳买卖股票时机含冷冻期
//https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/
// class Solution {
// public:
//     int maxProfit(vector<int>& prices) {
//         int n = prices.size();
//         if(n<2) return 0;
//         //0买入状态 1可交易状态 2冷冻状态
//         vector<vector<int>> vv(n,vector<int>(3));
//         vv[0][0] -= prices[0];  //第一天买入股票需要减钱
//         //第一天无法卖出 所以和冷冻期都为0
//         for(int i = 1;i<n;++i)
//         {
//             //买入状态一定是从买入了股票或者没有任何买卖
//             vv[i][0] = max(vv[i-1][0],vv[i-1][1]-prices[i]);
//             //可交易状态一定是从冷冻状态或者没有任何买卖状态过来的
//             vv[i][1] = max(vv[i-1][1],vv[i-1][2]);
//             //冷冻期一定是抛售了股票从买入状态过来的
//             vv[i][2] = vv[i-1][0]+prices[i];
//         }
//         return max(max(vv[n-1][0],vv[n-1][1]),vv[n-1][2]);
//     }
// };